package com.lyd.sweet.convert;

import org.mapstruct.InheritConfiguration;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.IterableMapping;
import org.mapstruct.Named;

import java.util.Collection;
import java.util.List;

/**
 * 基础查询对象
 *
 * @author 木木
 **/
public interface BasicConvert<ENTITY, QUERY, DTO, VO> {

    /**
     * 实体转 dto
     *
     * @param entity 实体
     * @return dto
     */
    @InheritConfiguration
    DTO toDto(ENTITY entity);

    /**
     * 实体转 vo
     *
     * @param entity 实体
     * @return vo
     */
    @Named(value = "toVo")
    VO toVo(ENTITY entity);

    /**
     * 实体 list转 dto list
     *
     * @param entities 实体
     * @return dto list
     */
    @InheritConfiguration
    List<DTO> toDtoList(Collection<ENTITY> entities);

    /**
     * 实体 list转 vo list
     *
     * @param entities 实体
     * @return vo list
     */
    @IterableMapping(qualifiedByName = "toVo")
    List<VO> toVoList(Collection<ENTITY> entities);

    /**
     * dto 转实体
     *
     * @param dto dto list
     * @return 实体 list
     */
    @InheritInverseConfiguration
    ENTITY dtoToENTITY(DTO dto);

    /**
     * dto list 转实体list
     *
     * @param target dto/vo list
     * @return 实体list
     */
    @InheritInverseConfiguration
    List<ENTITY> dtoToENTITYList(Collection<DTO> target);


    /**
     * vo 转实体
     *
     * @param vo vo
     * @return 实体
     */
    @InheritInverseConfiguration(name = "toVo")
    ENTITY voToENTITY(VO vo);

    /**
     * vo list 转实体list
     *
     * @param vo vo list
     * @return 实体list
     */
    @InheritInverseConfiguration
    List<ENTITY> voToENTITYList(Collection<VO> vo);

    /**
     * 查询对象转 dto
     *
     * @param query 查询对象
     * @return dto
     */
    @InheritConfiguration
    DTO queryToDto(QUERY query);

    /**
     * 查询对象转 实体
     *
     * @param query 查询对象
     * @return Entity
     */
    @InheritInverseConfiguration
    ENTITY toEntity(QUERY query);

    /**
     * 逗号隔开的字符串转字符串数组
     *
     * @param source
     * @return
     */
    @Named(value = "strToArray")
    default String[] strToArray(String source) {
        if (source == null || "".equals(source)) {
            return new String[]{};
        }
        return source.split(",");
    }

    /**
     * 字符串数组转逗号隔开的字符串
     *
     * @param source
     * @return
     */
    @Named(value = "arrayToStr")
    default String arrayToStr(String[] source) {
        if (source == null || source.length == 0) {
            return null;
        }
        return String.join(",", source);
    }

}
